//
// Created by QU on 2024/4/16.
//
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <map>

// c++17 filesystem header
#include <filesystem>
// string stream
#include <sstream>

using namespace std;

namespace fs = std::filesystem;

// map和unordered_map的下标操作
// c[k]返回关键字为k的元素；如果k不在c中，添加一个关键字为k的元素，对其进行值初始化
// c.at(k)访问关键字为k的元素，带参数检查：若k不在c中，抛出一个out_of_range异常.

int main() {
    auto m = map<string, size_t>();
    decltype(map<string, size_t>::value_type()) a;

    auto mm = multimap<string, size_t>(
            {{"aquawius",   5},
             {"this",       3},
             {"hahaha",     3},
             {"lambda",     4},
             {"testing",    6},
             {"aquawius",   100},
             {"returned",   9},
             {"type",       4},
             {"functionly", 0}});

    string search_item("aquawius"); //要查找的作者
    auto entries = mm.count(search_item); //元素的数量
    auto iter = mm.find(search_item);//此作者的第一本书
    // 用一个循环查找此作者的所有著作
    while (entries) {
        cout << iter->second << endl;//打印每个题目
        ++iter; //前进到下一本书
        --entries; // 记录已经打印了多少本书
    }

    // lower_bound upper_bound
    for (auto begin = mm.lower_bound(search_item), end = mm.upper_bound(search_item);
        begin != end; ++begin) {
        // ++begin, ++迭代器, 找到下一个重复的位置
        cout << begin->second << endl;
    }
    cout << endl;

    // equal_range
    for(auto pos = mm.equal_range(search_item); pos.first != pos.second; ++pos.first){
        cout << pos.first->first << endl;
        cout << pos.first->second << endl;
    }




}
